package com.smilive.delay.queue.netty;

import io.netty.util.HashedWheelTimer;
import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeUnit;

/**
 * @program: delay_queue_start
 * @Date: 2022-02-08 14:29
 * @Author: smilive
 * @Description:
 * 基于 netty 的时间轮算法 HashedWheelTimer 实现的延迟任务
 * https://zhuanlan.zhihu.com/p/65835110
 */
@Slf4j
public class NettyDelayQueue {

    public static void main(String[] args) throws InterruptedException {
        ThreadFactory factory = r -> {
            Thread thread = new Thread(r);
            thread.setName("DelayTask");
            thread.setDaemon(true);
            return thread;
        };
        /**
         * @param tickDuration - 每tick一次的时间间隔
         * @param unit - tickDuration 的时间单位
         * @param ticksPerWheel - 时间轮中的槽数
         * @param leakDetection - 检查内存溢出 检查内存溢出: 当HashedWheelTimer实例超过当前cpu可用核数*4的时候，将发出警告,因为时间轮是一个非常耗费资源的结构所以实例数目不能太高
         */
        HashedWheelTimer timer = new HashedWheelTimer(factory, 1,
                TimeUnit.SECONDS, 100, true);
        log.info("开始执行延迟任务...");
        for (int i = 0; i < 10; i++) {
            NettyDealyTask task = new NettyDealyTask(i);
            timer.newTimeout(task,i,TimeUnit.SECONDS);
        }
        Thread.sleep(Integer.MAX_VALUE);
    }
}
